A typical computer system includes at least a microprocessor and some form of memory. The microprocessor has, among other components, arithmetic, logic, and control circuitry that interpret and execute instructions necessary for the operation and use of the computer system. FIG. 1 shows a typical computer system (10) having a microprocessor (12), memory (14), integrated circuits (IC) (16) that have various functionalities, and communication paths (18, 20), i.e., buses and wires, that are necessary for the transfer of data among the aforementioned components of the computer system (10).
An instruction executed by the typical computer system shown in FIG. 1, at the lowest level, is a series of ones and zeroes that describe physical operations. Assembly code is an abstraction of the series of ones and zeroes representing physical operations within the computer that allow humans to write instructions for the computer. Examples of instructions written in assembly code include ADD, SUB, MUL, DIV, BR, etc. The examples of instructions previously mentioned are typically combined as an assembly program (or generally, a program) to accomplish sophisticated computer operations.
Depending on the type of instruction being executed, storage areas or registers are specified that contain data or an address to a location that contains data used in executing the instruction. Additional registers are used to facilitate the execution of instructions in a program, e.g., instruction registers, program counters, pipe stages registers (i.e., intermediary registers along the pipeline).
The facilitation of floating point registers is particularly important to the proper execution of floating point instructions. First, a floating point number is a number that is carried out to a certain number of decimal positions. For example, the number pi is 3.14159265 when carried out to the eighth decimal place. Decimal numbers may be represented in binary form as a floating point number. Floating point numbers are stored in three parts: the sign (plus or minus), the significant (or mantissa), and the exponent (or order of magnitude of the significant). The exponent determines the decimal place to which the decimal point “floats.”
Floating point numbers may be single or double precision. Typically, a single precision floating point number requires thirty-two bits to be represented. The first bit is the sign, the next eight bits form the exponent, and the remaining twenty-three bits form the significant. A double precision floating point number typically requires sixty-four bits to be represented. The first bit is the sign, the next eleven bits form the exponent; and the remaining fifty-two bits form the significant.
In a typical microprocessor as shown in FIG. 2, a single register (typically thirty-two bits wide) stores single precision floating point numbers and two registers are required to store double precision floating point numbers. The two registers used to store double precision floating point numbers are typically successive registers, e.g., if a double precision floating point number was specified as being stored in Register 2, the double precision floating point number most likely would reside in Register 2 and Register 3.
Floating point instructions may manipulate (e.g., move, convert, or perform arithmetic, trigonometric, logarithmic, or exponential operations) both single precision and double precision floating point numbers. Floating point instructions that operate on floating point numbers typically include two source registers in which the source operands are stored and a destination register in which the result of the operation is written. Floating point operations operate specifically on single or double precision floating point numbers and are considered single precision floating point operations or double precisions floating point operations, respectively. Because double precision floating point numbers require two registers for each source operand, floating point operations may execute improperly if source registers are not read from appropriate sources, e.g., floating point working register file (FWRF), floating point architectural register file (FARF), data cache unit (DCU), or bypass. For example, Code Sample 1 below shows three floating point operations.